{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Events聚类"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Users_Events.ipynb抽取events"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#保存数据\n",
    "import pickle\n",
    "import pandas as pd\n",
    "import itertools\n",
    "\n",
    "#处理事件字符串\n",
    "import datetime\n",
    "\n",
    "import numpy as np\n",
    "import scipy.io as sio\n",
    "import scipy.sparse as ss\n",
    "\n",
    "#相似度/距离\n",
    "import scipy.spatial.distance as ssd\n",
    "\n",
    "from collections import defaultdict\n",
    "from sklearn.preprocessing import normalize"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "number of uniqueUsers :3391\n",
      "number of uniqueEvents :13418\n"
     ]
    }
   ],
   "source": [
    " \"\"\"\n",
    "我们只关心train和test中出现的user和event，因此重点处理这部分关联数据\n",
    "\n",
    "train.csv 有6列：\n",
    "user：用户ID\n",
    "event：活动ID\n",
    "invited：是否被邀请（0/1）\n",
    "timestamp：ISO-8601 UTC格式时间字符串，表示用户看到该活动的时间\n",
    "interested, and not_interested\n",
    "\n",
    "Test.csv 除了没有interested, and not_interested，其余列与train相同\n",
    " \"\"\"\n",
    "    \n",
    "# 统计训练集中有多少不同的用户的events\n",
    "uniqueUsers = set()\n",
    "uniqueEvents = set()\n",
    "\n",
    "#倒排表\n",
    "#统计每个用户参加的活动   / 每个活动参加的用户\n",
    "eventsForUser = defaultdict(set)\n",
    "usersForEvent = defaultdict(set)\n",
    "    \n",
    "for filename in [\"train.csv\", \"test.csv\"]:\n",
    "    f = open(filename, 'rb')\n",
    "    \n",
    "    #忽略第一行（列名字）\n",
    "    str(f.readline().strip(), encoding = \"utf-8\").split(\",\")\n",
    "    \n",
    "    for line in f:    #对每条记录\n",
    "        cols = str(line.strip(), encoding = \"utf-8\").split(\",\")\n",
    "        uniqueUsers.add(cols[0])   #第一列为用户ID\n",
    "        uniqueEvents.add(cols[1])   #第二列为活动ID\n",
    "        \n",
    "        #eventsForUser[cols[0]].add(cols[1])    #该用户参加了这个活动\n",
    "        #usersForEvent[cols[1]].add(cols[0])    #该活动被用户参加\n",
    "    f.close()\n",
    "\n",
    "\n",
    "n_uniqueUsers = len(uniqueUsers)\n",
    "n_uniqueEvents = len(uniqueEvents)\n",
    "\n",
    "print(\"number of uniqueUsers :%d\" % n_uniqueUsers)\n",
    "print(\"number of uniqueEvents :%d\" % n_uniqueEvents)\n",
    "\n",
    "#用户关系矩阵表，可用于后续LFM/SVD++处理的输入\n",
    "#这是一个稀疏矩阵，记录用户对活动感兴趣\n",
    "userEventScores = ss.dok_matrix((n_uniqueUsers, n_uniqueEvents))\n",
    "userIndex = dict()\n",
    "eventIndex = dict()\n",
    "\n",
    "#重新编码用户索引字典\n",
    "for i, u in enumerate(uniqueUsers):\n",
    "    userIndex[u] = i\n",
    "    \n",
    "#重新编码活动索引字典    \n",
    "for i, e in enumerate(uniqueEvents):\n",
    "    eventIndex[e] = i\n",
    "\n",
    "n_records = 0\n",
    "ftrain = open(\"train.csv\", 'rb')\n",
    "ftrain.readline()\n",
    "for line in ftrain:\n",
    "    cols = str(line.strip(), encoding = \"utf-8\").split(\",\")\n",
    "    i = userIndex[cols[0]]  #用户\n",
    "    j = eventIndex[cols[1]] #活动\n",
    "    \n",
    "    eventsForUser[i].add(j)    #该用户参加了这个活动\n",
    "    usersForEvent[j].add(i)    #该活动被用户参加\n",
    "        \n",
    "    #userEventScores[i, j] = int(cols[4]) - int(cols[5])   #interested - not_interested\n",
    "    score = int(cols[4])\n",
    "    #if score == 0:  #0在稀疏矩阵中表示该元素不存在，因此借用-1表示interested=0\n",
    "    #userEventScores[i, j] = -1\n",
    "    #else:\n",
    "    userEventScores[i, j] = score\n",
    "ftrain.close()\n",
    "\n",
    "  \n",
    "##统计每个用户参加的活动，后续用于将用户朋友参加的活动影响到用户\n",
    "pickle.dump(eventsForUser, open(\"PE_eventsForUser.pkl\", 'wb'))\n",
    "##统计活动参加的用户\n",
    "pickle.dump(usersForEvent, open(\"PE_usersForEvent.pkl\", 'wb'))\n",
    "\n",
    "#保存用户-活动关系矩阵R，以备后用\n",
    "sio.mmwrite(\"PE_userEventScores\", userEventScores)\n",
    "\n",
    "\n",
    "#保存用户索引表\n",
    "pickle.dump(userIndex, open(\"PE_userIndex.pkl\", 'wb'))\n",
    "#保存活动索引表\n",
    "pickle.dump(eventIndex, open(\"PE_eventIndex.pkl\", 'wb'))\n",
    "\n",
    "    \n",
    "# 为了防止不必要的计算，我们找出来所有关联的用户 或者 关联的event\n",
    "# 所谓的关联用户，指的是至少在同一个event上有行为的用户pair\n",
    "# 关联的event指的是至少同一个user有行为的event pair\n",
    "uniqueUserPairs = set()\n",
    "uniqueEventPairs = set()\n",
    "for event in uniqueEvents:\n",
    "    i = eventIndex[event]\n",
    "    users = usersForEvent[i]\n",
    "    if len(users) > 2:\n",
    "        uniqueUserPairs.update(itertools.combinations(users, 2))\n",
    "        \n",
    "for user in uniqueUsers:\n",
    "    u = userIndex[user]\n",
    "    events = eventsForUser[u]\n",
    "    if len(events) > 2:\n",
    "        uniqueEventPairs.update(itertools.combinations(events, 2))\n",
    " \n",
    "#保存用户-事件关系对索引表\n",
    "pickle.dump(uniqueUserPairs, open(\"FE_uniqueUserPairs.pkl\", 'wb'))\n",
    "pickle.dump(uniqueEventPairs, open(\"PE_uniqueEventPairs.pkl\", 'wb'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 提取只在测试集出现的event_id\n",
    "event_id = pd.DataFrame(list(eventIndex.keys())).astype('int')\n",
    "event_id.columns = ['event_id'] \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>event_id</th>\n",
       "      <th>user_id</th>\n",
       "      <th>start_time</th>\n",
       "      <th>city</th>\n",
       "      <th>state</th>\n",
       "      <th>zip</th>\n",
       "      <th>country</th>\n",
       "      <th>lat</th>\n",
       "      <th>lng</th>\n",
       "      <th>c_1</th>\n",
       "      <th>...</th>\n",
       "      <th>c_92</th>\n",
       "      <th>c_93</th>\n",
       "      <th>c_94</th>\n",
       "      <th>c_95</th>\n",
       "      <th>c_96</th>\n",
       "      <th>c_97</th>\n",
       "      <th>c_98</th>\n",
       "      <th>c_99</th>\n",
       "      <th>c_100</th>\n",
       "      <th>c_other</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>684921758</td>\n",
       "      <td>3647864012</td>\n",
       "      <td>2012-10-31T00:00:00.001Z</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>244999119</td>\n",
       "      <td>3476440521</td>\n",
       "      <td>2012-11-03T00:00:00.001Z</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3928440935</td>\n",
       "      <td>517514445</td>\n",
       "      <td>2012-11-05T00:00:00.001Z</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2582345152</td>\n",
       "      <td>781585781</td>\n",
       "      <td>2012-10-30T00:00:00.001Z</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1051165850</td>\n",
       "      <td>1016098580</td>\n",
       "      <td>2012-09-27T00:00:00.001Z</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 110 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     event_id     user_id                start_time city state  zip country  \\\n",
       "0   684921758  3647864012  2012-10-31T00:00:00.001Z  NaN   NaN  NaN     NaN   \n",
       "1   244999119  3476440521  2012-11-03T00:00:00.001Z  NaN   NaN  NaN     NaN   \n",
       "2  3928440935   517514445  2012-11-05T00:00:00.001Z  NaN   NaN  NaN     NaN   \n",
       "3  2582345152   781585781  2012-10-30T00:00:00.001Z  NaN   NaN  NaN     NaN   \n",
       "4  1051165850  1016098580  2012-09-27T00:00:00.001Z  NaN   NaN  NaN     NaN   \n",
       "\n",
       "   lat  lng  c_1   ...     c_92  c_93  c_94  c_95  c_96  c_97  c_98  c_99  \\\n",
       "0  NaN  NaN    2   ...        0     1     0     0     0     0     0     0   \n",
       "1  NaN  NaN    2   ...        0     0     0     0     0     0     0     0   \n",
       "2  NaN  NaN    0   ...        0     0     0     0     0     0     0     0   \n",
       "3  NaN  NaN    1   ...        0     0     0     0     0     0     0     0   \n",
       "4  NaN  NaN    1   ...        0     0     0     0     0     0     0     0   \n",
       "\n",
       "   c_100  c_other  \n",
       "0      0        9  \n",
       "1      0        7  \n",
       "2      0       12  \n",
       "3      0        8  \n",
       "4      0        9  \n",
       "\n",
       "[5 rows x 110 columns]"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#读取全部活动数据\n",
    "events = pd.read_csv(\"events.csv\")\n",
    "events.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "new_events = events.merge(event_id,on = 'event_id',how = 'inner')#内连接，取交集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "new_events.to_csv(\"new_events.csv\", index=False, sep=',', encoding='utf_8')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 聚类-minibatch K-means"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#导入必要的工具包\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "from sklearn.cluster import MiniBatchKMeans\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn import metrics\n",
    "\n",
    "from sklearn.decomposition import PCA\n",
    "import time\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>event_id</th>\n",
       "      <th>user_id</th>\n",
       "      <th>start_time</th>\n",
       "      <th>city</th>\n",
       "      <th>state</th>\n",
       "      <th>zip</th>\n",
       "      <th>country</th>\n",
       "      <th>lat</th>\n",
       "      <th>lng</th>\n",
       "      <th>c_1</th>\n",
       "      <th>...</th>\n",
       "      <th>c_92</th>\n",
       "      <th>c_93</th>\n",
       "      <th>c_94</th>\n",
       "      <th>c_95</th>\n",
       "      <th>c_96</th>\n",
       "      <th>c_97</th>\n",
       "      <th>c_98</th>\n",
       "      <th>c_99</th>\n",
       "      <th>c_100</th>\n",
       "      <th>c_other</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>684921758</td>\n",
       "      <td>3647864012</td>\n",
       "      <td>2012-10-31T00:00:00.001Z</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>244999119</td>\n",
       "      <td>3476440521</td>\n",
       "      <td>2012-11-03T00:00:00.001Z</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3928440935</td>\n",
       "      <td>517514445</td>\n",
       "      <td>2012-11-05T00:00:00.001Z</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>12</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2582345152</td>\n",
       "      <td>781585781</td>\n",
       "      <td>2012-10-30T00:00:00.001Z</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1051165850</td>\n",
       "      <td>1016098580</td>\n",
       "      <td>2012-09-27T00:00:00.001Z</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 110 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     event_id     user_id                start_time city state  zip country  \\\n",
       "0   684921758  3647864012  2012-10-31T00:00:00.001Z  NaN   NaN  NaN     NaN   \n",
       "1   244999119  3476440521  2012-11-03T00:00:00.001Z  NaN   NaN  NaN     NaN   \n",
       "2  3928440935   517514445  2012-11-05T00:00:00.001Z  NaN   NaN  NaN     NaN   \n",
       "3  2582345152   781585781  2012-10-30T00:00:00.001Z  NaN   NaN  NaN     NaN   \n",
       "4  1051165850  1016098580  2012-09-27T00:00:00.001Z  NaN   NaN  NaN     NaN   \n",
       "\n",
       "   lat  lng  c_1   ...     c_92  c_93  c_94  c_95  c_96  c_97  c_98  c_99  \\\n",
       "0  NaN  NaN    2   ...        0     1     0     0     0     0     0     0   \n",
       "1  NaN  NaN    2   ...        0     0     0     0     0     0     0     0   \n",
       "2  NaN  NaN    0   ...        0     0     0     0     0     0     0     0   \n",
       "3  NaN  NaN    1   ...        0     0     0     0     0     0     0     0   \n",
       "4  NaN  NaN    1   ...        0     0     0     0     0     0     0     0   \n",
       "\n",
       "   c_100  c_other  \n",
       "0      0        9  \n",
       "1      0        7  \n",
       "2      0       12  \n",
       "3      0        8  \n",
       "4      0        9  \n",
       "\n",
       "[5 rows x 110 columns]"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#read data\n",
    "data = pd.read_csv(\"new_events.csv\")\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [],
   "source": [
    "#读取训练数据\n",
    "X_train = data.drop(['event_id','user_id','lat','lng','city','state','zip','country','start_time'],axis=1).values\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "the shape of train_image: (13418, 101)\n"
     ]
    }
   ],
   "source": [
    "# 原始输入的特征维数和样本数目\n",
    "print('the shape of train_image: {}'.format(X_train.shape))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(13418, 30)\n"
     ]
    }
   ],
   "source": [
    "#对数据进行PCA降维\n",
    "pca = PCA(n_components=30)\n",
    "pca.fit(X_train)\n",
    "\n",
    "X_train_pca = pca.transform(X_train)\n",
    "\n",
    "# 降维后的特征维数\n",
    "print(X_train_pca.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/limeng/anaconda3/lib/python3.6/site-packages/sklearn/model_selection/_split.py:2026: FutureWarning: From version 0.21, test_size will always complement train_size unless both are specified.\n",
      "  FutureWarning)\n"
     ]
    }
   ],
   "source": [
    "# 将训练集合拆分成训练集和校验集，在校验集上找到最佳的模型超参数（PCA的维数）\n",
    "X_train_part, X_val = train_test_split(X_train_pca, train_size = 0.8,random_state = 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 一个参数点（聚类数据为K）的模型，在校验集上评价聚类算法性能\n",
    "def K_cluster_analysis(K, X_train, X_val):\n",
    "    start = time.time()\n",
    "    \n",
    "    print(\"K-means begin with clusters: {}\".format(K));\n",
    "    \n",
    "    #K-means,在训练集上训练\n",
    "    mb_kmeans = MiniBatchKMeans(n_clusters = K)\n",
    "    mb_kmeans.fit(X_train)\n",
    "    \n",
    "    # 在训练集和测试集上测试\n",
    "    y_train_pred = mb_kmeans.fit_predict(X_train)\n",
    "    y_val_pred = mb_kmeans.predict(X_val)\n",
    "    \n",
    "    #以前两维特征打印训练数据的分类结果\n",
    "    #plt.scatter(X_train[:, 0], X_train[:, 1], c=y_pred)\n",
    "    #plt.show()\n",
    "\n",
    "    # K值的评估标准\n",
    "    #常见的方法有轮廓系数Silhouette Coefficient和Calinski-Harabasz Index\n",
    "    #这两个分数值越大则聚类效果越好\n",
    "    #CH_score = metrics.calinski_harabaz_score(X_train,mb_kmeans.predict(X_train))\n",
    "    CH_score = metrics.silhouette_score(X_train,mb_kmeans.predict(X_train))\n",
    "    \n",
    "    #也可以在校验集上评估K\n",
    "    #v_score = metrics.v_measure_score(y_val, y_val_pred)\n",
    "    \n",
    "    end = time.time()\n",
    "    print(\"CH_score: {}, time elaps:{}\".format(CH_score, int(end-start)))\n",
    "    #print(\"v_score: {}\".format(v_score))\n",
    "    \n",
    "    return CH_score#,v_score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "K-means begin with clusters: 10\n",
      "CH_score: 0.43762505191043566, time elaps:5\n",
      "K-means begin with clusters: 20\n",
      "CH_score: 0.24770755289314955, time elaps:3\n",
      "K-means begin with clusters: 30\n",
      "CH_score: 0.22691523428624388, time elaps:3\n",
      "K-means begin with clusters: 40\n",
      "CH_score: 0.20728624102227608, time elaps:3\n",
      "K-means begin with clusters: 50\n",
      "CH_score: 0.1925089990413204, time elaps:3\n",
      "K-means begin with clusters: 60\n",
      "CH_score: 0.16517604384610549, time elaps:3\n",
      "K-means begin with clusters: 70\n",
      "CH_score: 0.1518192648652673, time elaps:3\n",
      "K-means begin with clusters: 80\n",
      "CH_score: 0.1450587191798052, time elaps:3\n",
      "K-means begin with clusters: 90\n",
      "CH_score: 0.11363892902714282, time elaps:3\n"
     ]
    }
   ],
   "source": [
    "# 设置超参数（聚类数目K）搜索范围\n",
    "Ks = [10, 20, 30,40,50,60,70,80,90]\n",
    "CH_scores = []\n",
    "#v_scores = []\n",
    "for K in Ks:\n",
    "    ch = K_cluster_analysis(K, X_train_part, X_val)\n",
    "    CH_scores.append(ch)\n",
    "    #v_scores.append(v)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x1a1f67b3c8>]"
      ]
     },
     "execution_count": 128,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 绘制不同PCA维数下模型的性能，找到最佳模型／参数（分数最高）\n",
    "plt.plot(Ks, np.array(CH_scores), 'b-')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#显示聚类结果\n",
    "#画出聚类结果，每一类用一种颜色\n",
    "colors = ['b','g','r','k','c','m','y','#e24fff','#524C90','#845868']\n",
    "         \n",
    "n_clusters = 10\n",
    "mb_kmeans = MiniBatchKMeans(n_clusters = n_clusters)\n",
    "mb_kmeans.fit(X_train)\n",
    "\n",
    "y_train_pred = mb_kmeans.labels_\n",
    "cents = mb_kmeans.cluster_centers_#质心\n",
    "\n",
    "for i in range(n_clusters):\n",
    "    index = np.nonzero(y_train_pred==i)[0]\n",
    "    x1 = X_train[index,0]\n",
    "    x2 = X_train[index,1]\n",
    "    y_i = y_train[index]\n",
    "    for j in range(len(x1)):\n",
    "        if j < 20:  #每类打印20个\n",
    "            plt.text(x1[j],x2[j],str(int(y_i[j])),color=colors[i],\\\n",
    "                fontdict={'weight': 'bold', 'size': 9})\n",
    "    #plt.scatter(cents[i,0],cents[i,1],marker='x',color=colors[i],linewidths=12)\n",
    "\n",
    "plt.axis([-1,80,-1,50])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "K-means begin with clusters: 2\n",
      "CH_score: 0.6775612408677704, time elaps:5\n",
      "K-means begin with clusters: 3\n",
      "CH_score: 0.5924001112062339, time elaps:4\n",
      "K-means begin with clusters: 4\n",
      "CH_score: 0.5953263641468971, time elaps:4\n",
      "K-means begin with clusters: 5\n",
      "CH_score: 0.5262256332804889, time elaps:3\n",
      "K-means begin with clusters: 6\n",
      "CH_score: 0.5281831972228787, time elaps:3\n",
      "K-means begin with clusters: 7\n",
      "CH_score: 0.4588310411166044, time elaps:3\n"
     ]
    }
   ],
   "source": [
    "# 设置超参数（聚类数目K）搜索范围\n",
    "Ks = [2,3,4,5,6,7]\n",
    "CH_scores = []\n",
    "#v_scores = []\n",
    "for K in Ks:\n",
    "    ch = K_cluster_analysis(K, X_train_part, X_val)\n",
    "    CH_scores.append(ch)\n",
    "    #v_scores.append(v)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "key means 效果不好"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
